在進入 LiveView 章節之前,我們先來看看 Elixir Process 是什麼。
Elixir 跑在 Erlang VM (BEAM) 上,我們每次執行程式都會由一個 Process 負責,BEAM 裡的 process 與 CPU 的 process 或 thread 不同,Process 相當輕量,且每個 Process 之間都有獨立的記憶體空間,每個 Process 附有一個用來找到彼此的 PID (Process ID),與接受傳遞訊息的 Mailbox。
在一個有四核心的機器裡,BEAM 預設會開啟與 CPU 數量相同的 scheduler,可以想像是一個有很多 process 的大池子,有四個 scheduler 在處理所有的工作項目(process)
(實際上是四個工作列,但 shceduler 會自動分配工作量,所以我們可以想像成一個大池子)
每一個 Process 在處理一個固定的工作量後,就會暫停再度被放到池子上方,直到下一次輪到他執行。
(工作量是使用 reduction 計算,預設為 2000 次。)
由於 process 輕量切換快速,且整個機制是內建在語言層級,所以我們可以放心且容易的建立大量的 process。
在 Controller-View 的架構下,每一個 request 都會被分配到一個 process 處理,這個 process 會負責處理整個 request 的生命週期,找到對應的 route 與 controller,並執行 controller 裡的動作,最後回傳網頁給 client,完成後就會結束這個 process。
在我們即將要提到的 LiveView 裡,每一個 client 會被分配到一個 process,這個 process 會一直活著並且用 websocket 連結著 client 端。因為建立在 BEAM 這個特別為大量 process 設計的 VM 上,所以 LiveView 可以輕易的維持大量的 process 來服務等同數量的 client。
由於整個語言已經內建了優秀的非同步處理機制,我們可以輕易的建立一個 process 來處理非同步的工作,例如寄信、處理大量的資料、或是與其他服務溝通等等。
(雖然 Erlang 在設計時沒有參考 Actor Model,但是巧合的符合了 Actor Model 的設計。)